Skip to content

feat(profils): mode multi-profils — plusieurs enfants par appareil - #62

Merged
isc merged 5 commits into
mainfrom
claude/multi-profile-mode-o2dd9t
Jun 11, 2026
Merged

feat(profils): mode multi-profils — plusieurs enfants par appareil#62
isc merged 5 commits into
mainfrom
claude/multi-profile-mode-o2dd9t

Conversation

@isc

@isc isc commented Jun 11, 2026

Copy link
Copy Markdown
Owner

Quoi

Plusieurs enfants peuvent désormais partager le même appareil, chacun avec son propre profil : progression Leitner, badges, série et images mystère totalement indépendants.

Parcours

  • Mono-profil : strictement rien ne change (pas d'écran ni de bouton en plus, zéro friction sur la boucle quotidienne).
  • Dès 2 profils : l'app s'ouvre sur un écran « Qui joue ? » (prénoms + pastille-initiale colorée stable par prénom), et un bouton « changer de joueur » apparaît en haut de l'accueil.
  • Retour au premier plan : la PWA restant en mémoire des heures, « Qui joue ? » est reproposé quand l'app revient au premier plan après plus de 15 min en arrière-plan (multi-profils uniquement, depuis l'accueil seulement — jamais en pleine séance/récap, jamais sur un aller-retour rapide).
  • Ajouter un enfant : depuis l'espace parent (nouvelle section Profils) ou depuis « Qui joue ? » — rejoue l'onboarding complet (prénom, test de placement, intro des règles), annulable.
  • « Réinitialiser le profil » devient « Supprimer ce profil » : supprime le profil actif puis route vers l'accueil de l'autre enfant, « Qui joue ? », ou l'onboarding s'il n'en reste aucun.
  • Import : depuis Welcome → crée un nouveau profil (jamais d'écrasement d'un autre enfant) ; depuis l'espace parent → restaure le profil actif (inchangé).

Stockage et migration

  • Une clé par profil (multiplix-profile:<id>) + un index léger (multiplix-profiles, {id, prénom} + profil actif). Invariant : l'index n'existe que s'il reste ≥ 1 profil — l'inline script de index.html teste les deux clés pour le skip de la landing.
  • L'ancien schéma mono-clé est migré automatiquement au premier boot, sans perte (vérifié en navigateur réel sur le build de prod).
  • Format d'export inchangé → les sauvegardes existantes restent importables.

Aussi

  • ErrorBoundary (sauvegarde de secours) et scripts/generate-user-guide.mjs adaptés au nouveau schéma.
  • Guide utilisateur : nouvelle section « Plusieurs enfants » avec captures (« Qui joue ? », bouton changer de joueur).
  • Specs : nouveau chapitre §12 « Multi-profils » (le « mode multi-enfant » sort des évolutions V2), écran ajouté au tableau §7.1.
  • Changelog in-app : entrée du 2026-06-11.

Tests

  • Nouveau multiProfile.test.tsx (intégration DOM réelle) : migration legacy, ajout d'un 2ᵉ enfant + « Qui joue ? » au boot + bascule, annulation d'ajout, suppression avec bascule sur l'autre enfant, retour au premier plan (seuil court vs long, exclusion mi-séance, mono-profil).
  • userJourney mis à jour (bouton renommé). 172 tests verts, tsc -b et eslint propres, npm run build OK.
  • Smoke-test Playwright sur le build de prod : picker, sélection, changement de joueur, ajout annulable, migration legacy.

https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL

Chaque enfant a désormais son propre profil (progression, badges, série,
images mystère), stocké sous sa propre clé localStorage
(multiplix-profile:<id>) avec un index léger (multiplix-profiles) qui
liste les profils et le profil actif. L'ancien schéma mono-clé est migré
automatiquement au premier lancement, sans perte.

- Nouvel écran « Qui joue ? » au lancement dès 2 profils (pastille-initiale
  colorée stable par prénom) ; le parcours mono-profil reste inchangé.
- « Ajouter un enfant » depuis l'espace parent (section Profils) ou depuis
  « Qui joue ? » : rejoue l'onboarding complet, annulable.
- Bouton « changer de joueur » en haut de l'accueil (multi-profils only).
- « Réinitialiser le profil » devient « Supprimer ce profil » : supprime le
  profil actif et route vers l'écran adapté (accueil de l'autre enfant,
  « Qui joue ? », ou onboarding s'il n'en reste aucun).
- Import depuis Welcome = nouveau profil (jamais d'écrasement) ; import
  depuis l'espace parent = restauration du profil actif (inchangé).
- inline script index.html, ErrorBoundary (sauvegarde de secours) et
  generate-user-guide adaptés au nouveau schéma ; specs §12 + changelog.

Tests : multiProfile.test.tsx (migration legacy, ajout/sélection/annulation/
suppression en DOM réel) + mise à jour userJourney.

https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Preview supprimée (PR fermée). Les URLs ne sont plus accessibles.

claude added 4 commits June 11, 2026 09:12
Ajoute au guide utilisateur une section dédiée au mode multi-profils :
capture de l'écran « Qui joue ? » (Léa + Max) et de l'accueil avec le
bouton « changer de joueur ». seedProfile purge désormais les clés du
schéma multi-profils avant chaque seed — les addInitScript s'empilent
entre les captures et l'index écrit par seedMultiProfile masquait le
profil legacy des captures suivantes (voice notamment).

https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
Suppression et annulation d'ajout prenaient la même décision que le boot
(« Qui joue ? » si plusieurs profils, accueil sinon, onboarding si aucun)
mais la ré-implémentaient chacune en ternaires locaux. Les trois chemins
passent désormais par initialScreen. La visibilité du bouton Annuler du
Welcome s'aligne sur profileCount (la sémantique réelle : il existe déjà
un profil) plutôt que sur l'état mémoire profile.

https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
La PWA reste en mémoire des heures : l'enfant qui reprend la tablette
n'est souvent pas celui qui l'a laissée, et le choix du joueur au boot ne
couvre pas ce cas. Quand l'app revient au premier plan après plus de
15 minutes en arrière-plan et qu'il y a plusieurs profils, on repasse par
l'écran de choix — uniquement depuis l'accueil (jamais en pleine séance,
sur un récap ou dans l'espace parent), et jamais sur un aller-retour
rapide (notification).

Tests : seuil court vs long, exclusion mi-séance, mono-profil. Specs
§12.1 mises à jour.

https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
Le retour-picker au premier plan et le reload SW exprimaient deux fois la
même notion (home/welcome/profiles = rien à perdre). Extraction d'un
prédicat isDisposableScreen utilisé par les deux : le retour après une
longue absence couvre désormais aussi un ajout d'enfant laissé en plan,
comme le fait déjà le reload SW. Tests : helper seedProfiles pour le
seeding deux-profils copié-collé dans 3 tests.

https://claude.ai/code/session_01C2TMaVQwKBai1xMrEE4KmL
@isc
isc marked this pull request as ready for review June 11, 2026 19:07
@isc
isc merged commit 7137b91 into main Jun 11, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants